/***************************************************************************
 创建者: 华磊
 开始时间: 2018.8.14
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) hualei 2017.5.8 类的具体实现代码编写

 ***************************************************************************
 *  @file x.h
 *  功能:
 *
 *                                                                         *
 ***************************************************************************/
#ifndef PALDEFINE_H
#define PALDEFINE_H

#include "instructionEnum.h"

#include <QString>
#include <QVector>
#include <QDataStream>


typedef enum
{
    EM_STACK_DOING_WORK,
    EM_STACK_WORK_FINISH
}EM_STACK_WORK_STATE;

typedef enum
{
    EM_STACK_WORK_OUTPUT_PULSE,
    EM_STACK_FINISH_OUTPUT_PULSE
}EM_STACK_OUTPUT_PULSE_STATE;

typedef enum
{
    EM_STACK_WORK_OUTPUT_LEVEL,
    EM_STACK_FINISH_OUTPUT_LEVEL
}EM_STACK_OUTPUT_MODE_STATE;

typedef enum
{
    EM_STACK_UP,
    EM_STACK_DOWN
}EM_STACK_UPDOWN_STATE;

//typedef enum
//{
//    EM_ORDER_RCL,
//    EM_ORDER_CRL,
//}EM_ORDER_RCL_STATE;

typedef enum
{
    EM_STACK_ALIGN_ROW,
    EM_STACK_ALIGN_COL,
    EM_STACK_ALIGN_LAYER
}EM_STACK_ALLGN_RCL;


/**
 * @brief The SUserPoint class  用户点位信息类
 **/
class SUserPoint
{
public:
    SUserPoint();

    friend QDataStream& operator <<(QDataStream &out,SUserPoint &myVector);

    friend QDataStream& operator >>(QDataStream &in,SUserPoint &myVector);


public:
    /**
     * @brief m_fWorldAngle 回馈的直线角度（单位：弧度RAD）。X，Y，Z，W，P，R。
     **/
    QVector <float>  m_fWorldAngle;
    /**
     * @brief m_fJointAngle 回馈的关节角度（单位：弧度RAD）。 DH参照坐标系
     **/
    QVector <float>  m_fJointAngle;
    /**
     * @brief m_fTCPMatrix  回馈的TCP位置姿态矩阵（单位：mm）
     **/
    QVector <QVector <float> > m_fTCPMatrix;
    /**
     * @brief pointComment  点注释
     **/
    QString pointComment;
    /**
     * @brief configString  配置信息（x、y、z、w、p、r）姿态
     */
    QString configString;
    /**
     * @brief m_nPointLock  点锁点位标志
     **/
    int m_nPointLock;
    /**
     * @brief groupNum      群组号
     */
    int groupNum;
    /**
     * @brief userNum       用户坐标
     */
    int userNum;
    /**
     * @brief toolNum       工具坐标
     */
    int toolNum;
    /**
     * @brief direction     方向、姿态（0代表左手姿态、1代表右手姿态）
     */
    int direction;
};

/**
 * @brief The SStackStylePointInfo class     保存示教点信息
 **/
class SStackStylePointInfo
{
public:
    SStackStylePointInfo();

    friend QDataStream& operator <<(QDataStream &out,SStackStylePointInfo &myVector);

    friend QDataStream& operator >>(QDataStream &in,SStackStylePointInfo &myVector);


public:
    /**
     * @brief m_nMatrix 堆上示教点位置 【1，2，2】 【R，C，L】【GCODE_STACK_POSITION_RCL_COUNT】
     **/
    QVector <int> m_nMatrix;
    /**
     * @brief m_sStackPoint 点位信息
     **/
    SUserPoint m_sStackPoint;
};


/**
 * @brief The SStackInfo class  码垛初始信息
 **/
class SStackInfo
{
public:
    SStackInfo();

    friend QDataStream& operator <<(QDataStream &out,SStackInfo &myVector);

    friend QDataStream& operator >>(QDataStream &in,SStackInfo &myVector);


public:
    /**
     * @brief stackName 码垛名称
     **/
    QString stackName;
    /**
     * @brief m_nStackUpDown    堆上、堆下【种类：码垛、拆垛】
     **/
    int m_nStackUpDown;
    /**
     * @brief m_nRow    行数
     **/
    int m_nRow;
    /**
     * @brief m_nCol    列数
     **/
    int m_nCol;
    /**
     * @brief m_nLayer  层数
     **/
    int m_nLayer;
    /**
     * @brief m_nExecIncr   增加
     **/
    int m_nExecIncr;
    /**
     *@brief m_nAuxiliary   是否有辅助点
     */
    int m_nAuxiliary;
    /**
     * @brief m_nExecOrder  执行顺序 【CRL、RCL】行列层、列行层
     **/
    int m_nExecOrder;
    /**
     * @brief m_nTeachOrder 示教顺序：1，底层示教；0顶层示教【方向】
     **/
    int m_nTeachOrder;
    /**
     * @brief m_nIntervalEnable 行列层三点示教是否开启：1，开启；0，关闭【开关】正常情况处于关闭状态
     **/
    QVector <int> m_nIntervalEnable;
    /**
     * @brief m_nIntervalValue  行列层间距值【间距值】当行列层三点示教开启时，可以通过间距值从而减少需要示教的点位信息
     **/
    QVector <float> m_nIntervalValue;
    /**
     * @brief m_nStackExistAlready  是否已经设置叠栈数据
     **/
    int m_nStackExistAlready;
    /**
     * @brief m_nStackType  码垛类型：B、BX、E、EX
     **/
    int m_nStackType;
    /**
     * @brief m_nStackNumber    叠栈号码
     */
    int m_nStackNumber;
    /**
     * @brief m_nStackProximityCount    接近点数
     **/
    int m_nStackProximityCount;
    /**
     * @brief m_nStackFleeCount 逃离点数
     **/
    int m_nStackFleeCount;
    /**
     * @brief m_nStackStyleCount    式样点数
     **/
    int m_nStackStyleCount;
    /**
     * @brief m_nStackRegister  栈板寄存器
     **/
    int m_nStackRegister;
    /**
     * @brief m_nStackPointCount    堆上示教点个数
     **/
    int m_nStackPointCount;
    /**
     * @brief m_nStackFinishOutputMode  码垛完成信号输出模式
     **/
    int m_nStackFinishOutputMode;
    /**
     * @brief m_nStackFinishOutputDoNum 码垛完成信号输出DO号
     **/
    int m_nStackFinishOutputDoNum;
    /**
     * @brief stackPointA_n 接近点
     **/
    QVector <SUserPoint> stackPointA_n;
    /**
     * @brief stackPointBTM 堆叠点
     **/
    SUserPoint stackPointBTM;
    /**
     * @brief stackPointR_n 逃离点
     **/
    QVector <SUserPoint> stackPointR_n;

    /**
     * @brief m_sStackStylePointInfo    示教点信息
     **/
    QVector <SStackStylePointInfo> m_sStackStylePointInfo;

};


/**
 * @brief The PalletizingGoodsData class    每一个码垛点的信息
 **/
class PalletizingGoodsData
{
public:
    PalletizingGoodsData();

    friend QDataStream& operator <<(QDataStream &out,PalletizingGoodsData &myVector);

    friend QDataStream& operator >>(QDataStream &in,PalletizingGoodsData &myVector);


public:
    /**
     * @brief m_nMatrix 堆叠点行列层【R，C，L】
     **/
    QVector <int>   m_nMatrix;

    /**
     * @brief m_sStackPointA_n  接近点
     **/
    QVector <QVector <float> > m_sStackPointA_n;
    /**
     * @brief m_sStackPointBTM  堆叠点
     **/
    QVector <float>   m_sStackPointBTM;
    /**
     * @brief m_sStackPointR_n  逃离点
     **/
    QVector <QVector <float> > m_sStackPointR_n;
};

#endif // PALDEFINE_H

